/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2019/10/15
* Description        : Main program body.
*******************************************************************************/ 

/*
 *@Note
 互补输出和死区插入模式例程：
 TIM1_CH1(PA8),TIM1_CH1N(PB13)
 本例程演示 TIM1 三种带死区互补输出模式：带死区插入的互补输出、死区波形延迟
 大于负脉冲、死区波形延迟大于正脉冲。
 
*/

#include "debug.h"

/*******************************************************************************
* Function Name  : TIM1_Dead_Time_Init
* Description    : Initializes TIM1 complementary output and dead time.
* Input          : arr: the period value.
*                  psc: the prescaler value.
*									 ccp: the pulse value.
* Return         : None
*******************************************************************************/
void TIM1_Dead_Time_Init( u16 arr, u16 psc, u16 ccp )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA  | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE );	

	/* TIM1_CH1 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStructure );
	
	/* TIM1_CH1N */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOB, &GPIO_InitStructure );
	
	TIM_TimeBaseInitStructure.TIM_Period = arr;	
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;	
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	
	TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);	

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;	
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  
	TIM_OCInitStructure.TIM_Pulse = ccp;	
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;	
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;	  
	TIM_OC1Init( TIM1, &TIM_OCInitStructure );

  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;	
	TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;	
	TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;	
	TIM_BDTRInitStructure.TIM_DeadTime = 0xFF; 
	TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;	
	TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;	
	TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;	
	TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE );		
	TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );	
	TIM_ARRPreloadConfig( TIM1, ENABLE );			
	TIM_Cmd( TIM1, ENABLE );
}

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{
	USART_Printf_Init(115200);
	printf("SystemClk:%d\r\n",SystemCoreClock);

	/* Complementary output with dead-time insertion */
	TIM1_Dead_Time_Init( 100, 48-1, 50 );	
	/* Dead-time waveforms with delay greater than the negative pulse */
//	TIM1_Dead_Time_Init( 100, 48-1, 10 );	
	/* Dead-time waveforms with delay greater than the positive pulse. */
//	TIM1_Dead_Time_Init( 100, 48-1, 90 );
	
	while(1);
}

